/*
 * @Description: 开放字段reducer
 * @Author: Rfan
 * @Date: 2022-03-08 15:54:50
 * @LastEditTime: 2022-08-23 10:54:57
 */

import {
  ADD_OPENING,
  DELETE_OPENING,
  EDIT_OPENING,
  INIT_TABLE,
  SET_SELECTED_ITEM,
  SET_SELECT_AT,
  SET_SELECT_FOND,
  SET_SELECT_LEVEL,
  SET_OPENING_LIST,
  SET_SORT_TYPE
} from '../constants';
import { jsonClone } from '@/utils';
import { concat } from 'lodash-es';

export const OpeningReducer = (state, action) => {
  switch (action.type) {
    /**
     * @description:设置选中的全宗
     * @param {*} data 选中的全宗
     * @return {*} 选中的全宗
     */
    case SET_SELECT_FOND:
      return {
        ...state,
        selectFond: action.data
      };

    /**
     * @description:设置选中的档案类型
     * @param {*} data 选中的档案类型
     * @return {*} 选中的档案类型
     */
    case SET_SELECT_AT:
      return {
        ...state,
        selectAT: action.data
      };

    /**
     * @description:设置选中的层级
     * @param {*} data 选中的层级
     * @return {*} 选中的层级
     */
    case SET_SELECT_LEVEL:
      return {
        ...state,
        selectLevel: action.data
      };

    /**
     * @description:设置选中的层级
     * @param {*} data 选中的层级
     * @return {*} 选中的层级
     */
    case SET_SORT_TYPE:
      return {
        ...state,
        sortType: action.data
      };

    /**
     * @description: 清空选中的条目
     * @return {number[]} 空数组
     */
    case INIT_TABLE: {
      return {
        ...state,
        selectItems: []
      };
    }

    /**
     * @description: 保存表格选中的条目id
     * @param {number[]} data
     */
    case SET_SELECTED_ITEM:
      return { ...state, selectItems: action.data };

    /**
     * @description: 设置开放字段列表
     * @param {*} data 开放字段列表
     * @param {number} openingType 开放字段类型
     * @return {any[]} 新的列表
     */
    case SET_OPENING_LIST: {
      const { data, openingType } = action;
      const listKey = openingType === 1 ? 'list' : 'retrieveList';
      return {
        ...state,
        [listKey]: data
      };
    }

    /**
     * @description: 增加开放字段规则
     * @param {*} data 开放字段列表
     * @param {*} field 选中的字段
     * @param {number} openingType 开放字段类型
     * @return {any[]} 新的列表
     */
    case ADD_OPENING: {
      const { data, openingType } = action;
      const listKey = openingType === 1 ? 'list' : 'retrieveList';
      return {
        ...state,
        [listKey]: concat(state[listKey], data),
        dialog: {
          fieldList: []
        }
      };
    }

    /**
     * @description: 编辑开放字段规则
     * @param {number} id 编辑的开放字段ID
     * @param {*} data 返回编辑的开放字段对象
     * @param {number} openingType 开放字段类型
     * @return {any[]} 新的列表
     */
    case EDIT_OPENING: {
      const { id, data, openingType } = action;
      const listKey = openingType === 1 ? 'list' : 'retrieveList';

      const list = jsonClone(state[listKey]);
      for (let i = 0; i < list.length; i++) {
        if (list[i].rule.id === id) {
          list.splice(i, 1, data);
        }
      }
      return { ...state, [listKey]: list };
    }

    /**
     * @description: 删除开放字段
     * @param {Key[]} ids 删除开放字段的ID
     * @return {any[]} 新的列表
     */
    case DELETE_OPENING: {
      const { ids } = action;
      const list = state.list.filter((item) => ids.indexOf(item.rule.id) < 0);
      const retrieveList = state.retrieveList.filter((item) => ids.indexOf(item.rule.id) < 0);
      return { ...state, list, retrieveList };
    }

    default:
      console.log('untouched', action);
      return state;
  }
};
